#!/usr/bin/env node

'use strict'

// Run bootstrap first to ensure all the dependencies used later in this script
// are installed.
require('./bootstrap')

// Needed so we can require src/module-cache.coffee during generateModuleCache
require('coffee-script/register')
require('colors')

const yargs = require('yargs')
const argv = yargs
  .usage('Usage: $0 [options]')
  .help('help')
  .describe('code-sign',  'Code-sign executables (macOS and Windows only)')
  .describe('create-windows-installer', 'Create installer (Windows only)')
  .describe('create-debian-package', 'Create .deb package (Linux only)')
  .describe('create-rpm-package', 'Create .rpm package (Linux only)')
  .describe('compress-artifacts', 'Compress Atom binaries (and symbols on macOS)')
  .describe('install', 'Install Atom')
  .string('install')
  .wrap(yargs.terminalWidth())
  .argv

const checkChromedriverVersion = require('./lib/check-chromedriver-version')
const cleanOutputDirectory = require('./lib/clean-output-directory')
const codeSignOnMac = require('./lib/code-sign-on-mac')
const compressArtifacts = require('./lib/compress-artifacts')
const copyAssets = require('./lib/copy-assets')
const createDebianPackage = require('./lib/create-debian-package')
const createRpmPackage = require('./lib/create-rpm-package')
const createWindowsInstaller = require('./lib/create-windows-installer')
const dumpSymbols = require('./lib/dump-symbols')
const generateAPIDocs = require('./lib/generate-api-docs')
const generateMetadata = require('./lib/generate-metadata')
const generateModuleCache = require('./lib/generate-module-cache')
const generateStartupSnapshot = require('./lib/generate-startup-snapshot')
const installApplication = require('./lib/install-application')
const packageApplication = require('./lib/package-application')
const prebuildLessCache = require('./lib/prebuild-less-cache')
const transpileBabelPaths = require('./lib/transpile-babel-paths')
const transpileCoffeeScriptPaths = require('./lib/transpile-coffee-script-paths')
const transpileCsonPaths = require('./lib/transpile-cson-paths')
const transpilePegJsPaths = require('./lib/transpile-peg-js-paths')
const transpilePackagesWithCustomTranspilerPaths = require('./lib/transpile-packages-with-custom-transpiler-paths.js')

process.on('unhandledRejection', function (e) {
  console.error(e.stack || e)
  process.exit(1)
})

checkChromedriverVersion()
cleanOutputDirectory()
copyAssets()
transpilePackagesWithCustomTranspilerPaths()
transpileBabelPaths()
transpileCoffeeScriptPaths()
transpileCsonPaths()
transpilePegJsPaths()
generateModuleCache()
prebuildLessCache()
generateMetadata()
generateAPIDocs()
dumpSymbols()
  .then(packageApplication)
  .then(packagedAppPath => generateStartupSnapshot(packagedAppPath).then(() => packagedAppPath))
  .then(packagedAppPath => {
    if (process.platform === 'darwin') {
      if (argv.codeSign) {
        codeSignOnMac(packagedAppPath)
      } else {
        console.log('Skipping code-signing. Specify the --code-sign option to perform code-signing'.gray)
      }
    } else if (process.platform === 'win32') {
      if (argv.createWindowsInstaller) {
        return createWindowsInstaller(packagedAppPath, argv.codeSign).then(() => packagedAppPath)
      }
      else {
        console.log('Skipping creating installer. Specify the --create-windows-installer option to create a Squirrel-based Windows installer. Code-signing was skipped too.'.gray)
      }
    } else if (process.platform === 'linux') {
      if (argv.createDebianPackage) {
        createDebianPackage(packagedAppPath)
      } else {
        console.log('Skipping creating debian package. Specify the --create-debian-package option to create it.'.gray)
      }

      if (argv.createRpmPackage) {
        createRpmPackage(packagedAppPath)
      } else {
        console.log('Skipping creating rpm package. Specify the --create-rpm-package option to create it.'.gray)
      }
    }

    return Promise.resolve(packagedAppPath)
  }).then(packagedAppPath => {
    if (argv.compressArtifacts) {
      compressArtifacts(packagedAppPath)
    } else {
      console.log('Skipping artifacts compression. Specify the --compress-artifacts option to compress Atom binaries (and symbols on macOS)'.gray)
    }

    if (argv.install != null) {
      installApplication(packagedAppPath, argv.install)
    } else {
      console.log('Skipping installation. Specify the --install option to install Atom'.gray)
    }
  })
